#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,m;
ll a[N];
struct node
{
    int l,r;
    ll sum,add;
}tr[N*4];

void pushup(int u)
{
    tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}

void pushdown(int u)
{
    auto& root=tr[u], left=tr[u<<1], right=tr[u<<1|1];
    left.add+=root.add; right.add+=root.add; root.add=0;
    
    left.sum+=left.add*(left.r-left.l+1);
    right.sum+=right.add*(right.r-right.l+1);
}

void build(int u,int l,int r)
{
    if(l==r)
    {
        tr[u]={l,r,a[l],0};
    }
    else
    {
        tr[u]={l,r};
        int mid=l+r>>1;
        build(u<<1, l, mid);build(u<<1|1, mid+1, r);
        pushup(u);
    }
}

void modify(int u,int l,int r,int d)
{
    if(tr[u].r<=r && tr[u].l>=l)
    {
        tr[u].sum+=d*(tr[u].r-tr[u].l+1);
        tr[u].add+=d;
    }
    else
    {
        pushdown(u);
        int mid=tr[u].l+tr[u].r>>1;
        if(mid>=r) modify(u<<1,l,r,d);
        else if(mid<l) modify(u<<1|1,l,r,d);
        else
        {
            modify(u<<1,l,mid,d);
            modify(u<<1|1,mid+1,r,d);
        }
        pushup(u);
    }
}

ll query(int u,int l,int r)
{
    if(tr[u].l==l && tr[u].r==r)
    {
        return tr[u].sum;
    }
    else
    {
    	pushdown(u);
        int mid=tr[u].l+tr[u].r>>1;
        if(mid>=r) return query(u<<1,l,r);
        else if(mid<l) return query(u<<1|1,mid+1,r);
        else
        {
            return query(u<<1,l,mid) + query(u<<1|1,mid+1,r);
        }
    }
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%lld",a+i);
    build(1,1,n);
    int l,r;
    char op[2];
    int d;
    while(m--)
    {
        scanf("%s %d %d",op,&l,&r);
        if(*op=='Q')
        {
            printf("%lld\n",query(1,l,r));
        }
        else
        {
            scanf("%d",&d);
            modify(1,l,r,d);
        }
    }
    return 0;
}
